home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / data / awkscrpt / asmz80.awk < prev    next >
Text File  |  1995-02-11  |  7KB  |  324 lines

  1. BEGIN {
  2.     err="/dev/stderr"
  3.     printf("\n超高速(嘘)Z80クロスアセンブラ") >err
  4.     printf(" ASMZ80\t\tBy Jouji\n\n") >err
  5.     if(tmp=="") tmp="asmz80.tmp"
  6.     dat="asmz80.dat"
  7.     em[1]="不正なオペレーションコードが使われている"
  8.     em[2]="文法違反"
  9.     em[3]="未定義シンボルが使われている"
  10.     em[4]="相対ジャンプ先が範囲を越えている"
  11.     em[5]="変位の値が範囲を越えている"
  12.     em[6]="不正なアドレスが指定されている"
  13.     em[7]="シンボルが二重に定義されている"
  14.     print "ニーモニックテーブルにデータをセットしています‥‥" >err
  15.     oc="^(LD|PUSH|POP|EX|EXX|LDI|LDIR|LDD|LDDR|CPI|CPIR|CPD|CPDR|DAA|CPL|NEG|CCF|SCF|NOP|HALT|DI|EI|ADD|ADC|SUB|SBC|AND|OR|XOR|CP|INC|DEC|RLCA|RLA|RRCA|RRA|RLD|RRD|JP|JR|DJNZ|CALL|RET|RETI|RETN|IN|INI|INIR|IND|INDR|OUT|OUTI|OUTIR|OUTD|OUTDR)$"
  16.     r1="^([ABCDEHLIRFZPM]|\\((C|BC|DE|HL|IX|IY|SP)\\)|AF'?|BC|DE|HL|IX|IY|SP|NZ|NC|PO|PE)$"
  17.     r2="^([ABCDEHLIR]|\\((C|BC|DE|HL|IX|IY)\\)|AF'|BC|DE|HL|IX|IY|SP)$"
  18.     while(getline<dat >0) {s=$0;sub(/^.*\t/,"",s);ob[$1]=s}
  19.     r["B"]=0;r["C"]=1;r["D"]=2;r["E"]=3;r["H"]=4;r["L"]=5;r["(HL)"]=6;r["A"]=7
  20.     as["ADD"]=128;as["ADC"]=136;as["SBC"]=152
  21.     er["SUB"]=144;er["AND"]=160;er["XOR"]=168;er["OR"]=176;er["CP"]=184
  22.     id["INC"]=4;id["DEC"]=5
  23.     rs["RLC"]=0;rs["RRC"]=8;rs["RL"]=16;rs["RR"]=24
  24.     rs["SLA"]=32;rs["SRA"]=40;rs["SRL"]=56
  25.     b["BIT"]=64;b["RES"]=128;b["SET"]=192
  26.     FS=",|[ \t]+"
  27.     h["0"]=0; h["1"]=1; h["2"]=2; h["3"]=3; h["4"]=4; h["5"]=5; h["6"]=6
  28.     h["7"]=7; h["8"]=8; h["9"]=9; h["A"]=10;h["B"]=11;h["C"]=12;h["D"]=13
  29.     h["E"]=14;h["F"]=15
  30.     for(i=32;i<256;i++) asc[sprintf("%c",i)]=i
  31.     print "パス1の処理中‥‥" >err
  32. }
  33.  
  34. {    sub(/;.*$/,"")
  35.     if($0=="") next
  36.     while($0~/'.+'/) {
  37.         a=index($0,"'")
  38.         s=substr($0,1,a-1)
  39.         t=substr($0,a+1)
  40.         a=index(t,"'")
  41.         u=substr(t,1,a-1)
  42.         t=substr(t,a+1)
  43.         l=length(u)
  44.         v=""
  45.         for(i=1;i<=l;i++) {
  46.             c=substr(u,i,1)
  47.             v=v sprintf("%d,",asc[c])
  48.         }
  49.         sub(/.$/,"",v)
  50.         $0=s v t
  51.     }
  52.     $0=toupper($0)
  53. }
  54. $1!="" {
  55.     sub(/:+$/,"",$1)
  56.     if($1 in st) error(7,NR)
  57.     st[$1]=addr
  58. }
  59. $2=="EQU" {st[$1]=tonum($3);next}
  60. $2=="ORG" {
  61.     a=tonum($3)
  62.     if(a<addr) error(6,NR)
  63.     addr=a
  64.     next
  65. }
  66. $2=="DB" {
  67.     printf("%04d %04X",NR,addr) >tmp
  68.     for(i=3;i<=NF && $i!="";i++) {
  69.         if($i~/^[0-9]/) printf(" %02X",tonum($i)%256) >tmp
  70.         else printf(" @1%s",$i) >tmp
  71.         addr++
  72.     }
  73.     print"" >tmp
  74.     next
  75. }
  76. $2=="DW" {
  77.     printf("%04d %04X",NR,addr) >tmp
  78.     for(i=3;i<=NF && $i!="";i++) {
  79.         if($i~/^[0-9]/) {
  80.             n=tonum($i)
  81.             printf(" %02X %02X",n%256,int(n/256)) >tmp
  82.         } else
  83.             printf(" @2%s",$i) >tmp
  84.         addr+=2
  85.     }
  86.     print"" >tmp
  87.     next
  88. }
  89. $2=="DS" {
  90.     n=tonum($3)
  91.     for(i=1;i<=n;i++) printf("%04d D%04X 00\n",NR,addr++) >tmp
  92.     next
  93. }
  94. $2=="END" {exit}
  95. $2=="" {next}
  96. {fl=0;op=$2}
  97. op=="IM" {
  98.     if($3=="0") c="46"
  99.     else if($3=="1") c="56"
  100.     else if($3=="2") c="5E"
  101.     else error(2,NR)
  102.     printf("%04d %04X ED %s\n",NR,addr,c) >tmp
  103.     addr+=2
  104.     next
  105. }
  106. op=="RST" {
  107.     n=tonum($3)
  108.     if(n<8) n=8*n
  109.     if(n<57 && n%8==0) c=199+n; else error(2,NR)
  110.     printf("%04d %04X %02X\n",NR,addr,c) >tmp
  111.     addr++
  112.     next
  113. }
  114. op=="LD" {
  115.     if(($3 in r)&&($4 in r)) {
  116.         c=64+8*r[$3]+r[$4]
  117.         printf("%04d %04X %02X\n",NR,addr,c) >tmp
  118.         addr++
  119.         next
  120.     }
  121.     if(($3 in r)&&($4~/^\(I[XY].*\)$/)) {
  122.         c=70+8*r[$3]
  123.         s=ixiy($4)
  124.         printf("%04d %04X %s %02X %s\n",NR,addr,xy,c,s) >tmp
  125.         addr+=3
  126.         next
  127.     }
  128.     if($3~/^\(I[XY].*\)$/) {
  129.         s=ixiy($3)
  130.         if($4 in r) {
  131.             c=112+r[$4]
  132.             a=addr+3
  133.         } else {
  134.             c=54
  135.             if($4~/^[0-9]/) {
  136.                 n=tonum($4)
  137.                 s=s sprintf(" %02X",n%256)
  138.             } else
  139.                 s=s" @1"$4
  140.             a=addr+4
  141.         }
  142.         printf("%04d %04X %s %02X %s\n",NR,addr,xy,c,s) >tmp
  143.         addr=a
  144.         next
  145.     }
  146. }
  147. (op in as)&&($3=="A") {
  148.     if($4 in r) {
  149.         c=as[op]+r[$4]
  150.         printf("%04d %04X %02X\n",NR,addr,c) >tmp
  151.         addr++
  152.         next
  153.     }
  154.     if($4~/^\(I[XY].*\)$/) {
  155.         c=as[op]+6
  156.         s=ixiy($4)
  157.         printf("%04d %04X %s %02X %s\n",NR,addr,xy,c,s) >tmp
  158.         addr+=3
  159.         next
  160.     }
  161. }
  162. (op in er) {
  163.     if($3 in r) {
  164.         c=er[op]+r[$3]
  165.         printf("%04d %04X %02X\n",NR,addr,c) >tmp
  166.         addr++
  167.         next
  168.     }
  169.     if($3~/^\(I[XY].*\)$/) {
  170.         c=er[op]+6
  171.         s=ixiy($3)
  172.         printf("%04d %04X %s %02X %s\n",NR,addr,xy,c,s) >tmp
  173.         addr+=3
  174.         next
  175.     }
  176. }
  177. (op in id) {
  178.     if($3 in r) {
  179.         c=id[op]+8*r[$3]
  180.         printf("%04d %04X %02X\n",NR,addr,c) >tmp
  181.         addr++
  182.         next
  183.     } else if($3~/^\(I[XY].*\)$/) {
  184.         c=id[op]+48
  185.         s=ixiy($3)
  186.         printf("%04d %04X %s %02X %s\n",NR,addr,xy,c,s) >tmp
  187.         addr+=3
  188.         next
  189.     }
  190. }
  191. (op in rs) {
  192.     if($3 in r) {
  193.         c=rs[op]+r[$3]
  194.         printf("%04d %04X CB %02X\n",NR,addr,c) >tmp
  195.         addr+=2
  196.     } else if($3~/^\(I[XY].*\)$/) {
  197.         c=rs[op]+6
  198.         s=ixiy($3)
  199.         printf("%04d %04X %s CB %s %02X\n",NR,addr,xy,s,c) >tmp
  200.         addr+=4
  201.     } else error(2,NR)
  202.     next
  203. }
  204. (op in b)&&($3~/^[0-7]$/) {
  205.     if($4 in r) {
  206.         c=b[op]+8*$3+r[$4]
  207.         printf("%04d %04X CB %02X\n",NR,addr,c) >tmp
  208.         addr+=2
  209.     } else if($4~/^\(I[XY].*\)$/) {
  210.         c=b[op]+8*$3+6
  211.         s=ixiy($4)
  212.         printf("%04d %04X %s CB %s %02X\n",NR,addr,xy,s,c) >tmp
  213.         addr+=4
  214.     } else error(2,NR)
  215.     next
  216. }
  217. op!~oc {error(1,NR)}
  218. $3!="" {
  219.     if($3~r1)
  220.         op=op $3
  221.     else if($3~/^\(.+\)$/) {
  222.         fl=1
  223.         l=$3
  224.         gsub(/[()]/,"",l)
  225.         op=op "(?)"}
  226.     else {
  227.         fl=1
  228.         l=$3
  229.         op=op "?"}
  230. }
  231. $4!="" {
  232.     if($4~r2)
  233.         op=op $4
  234.     else if($4~/^\(.+\)$/) {
  235.         fl=1
  236.         l=$4
  237.         gsub(/[()]/,"",l)
  238.         op=op "(?)"}
  239.     else {
  240.         fl=1
  241.         l=$4
  242.         op=op "?"}
  243. }
  244. {    if(!(op in ob)) error(2,NR)
  245.     split(ob[op],x)
  246.     printf("%04d %04X",NR,addr) >tmp
  247.     for(i=1;i<=x[1];i++) printf(" %s",x[i+2]) >tmp
  248.     addr+=x[1]+x[2]
  249.     if(fl==0) {print"" >tmp;next}
  250.     if(l~/^[0-9]/) {
  251.         n=tonum(l)
  252.         printf(" %02X",n%256) >tmp
  253.         if(x[2]==2) printf(" %02X",int(n/256)) >tmp
  254.     } else if($2~/^(JR|DJNZ)$/) printf(" @e%s",l) >tmp
  255.     else printf(" @%1d%s",x[2],l) >tmp
  256.     print"" >tmp
  257. }
  258.  
  259. END {
  260.     print"" >tmp
  261.     for(s in st) printf("%04X %s\n",st[s],s) >tmp
  262.     close(tmp)
  263.     if(errf==1) exit
  264.     printf("パス2の処理中‥‥\n\n") >err
  265.     while(getline<tmp >0 && $0!="") {
  266.         for(i=3;i<=NF;i++)
  267.             if($i~/^@/) {
  268.                 nr=substr($i,2,1)
  269.                 l=substr($i,3)
  270.                 if(!(l in st)) error(3,$1)
  271.                 n=st[l]
  272.                 if(nr=="e") {
  273.                     addr=tonum("0"$2"H")
  274.                     e=n-(addr+2)
  275.                     if(e>127||e<-128) error(4,$1)
  276.                     e=(e<0)?e+256:e
  277.                     $i=sprintf("%02X",e)
  278.                 } else if(nr~/[+-]/) {
  279.                     if(nr=="-") n=-n
  280.                     if(n<-128||n>255) error(5,$1)
  281.                     if(n<0) n+=256
  282.                     $i=sprintf("%02X",n)
  283.                 } else {
  284.                     $i=sprintf("%02X",n%256)
  285.                     if(nr=="2") $i=$i sprintf(" %02X",int(n/256))
  286.                 }
  287.             }
  288.         print
  289.     }
  290. }
  291.  
  292. function tonum(s,  i,m,n,c) {
  293.     if(s!~/^[0-9]/) return 0
  294.     if(s!~/H$/) return s+0
  295.     m=length(s)
  296.     for(i=1;i<m;i++) {
  297.         c=substr(s,i,1)
  298.         if(c!~/^[0-9A-F]$/) return n
  299.         n=16*n+h[c]
  300.     }
  301.     return n
  302. }
  303.  
  304. function ixiy(s) {
  305.     xy=index(s,"IX")?"DD":"FD"
  306.     l=substr(s,4);sub(/.$/,"",l)
  307.     if(l=="") l="+0"
  308.     if(l!~/^[+-]/) error(2,NR)
  309.     pm=substr(l,1,1);sub(/^./,"",l)
  310.     if(l~/^[0-9]/) {
  311.         n=tonum(l)
  312.         if(pm=="-") n=-n
  313.         if(n<-128||n>255) error(5,NR)
  314.         if(n<0) n+=256
  315.         return sprintf("%02X",n)
  316.     } else return ("@" pm l)
  317. }
  318.  
  319. function error(i,s) {
  320.     print em[i] ": " s " 行" >err
  321.     errf=1
  322.     exit
  323. }
  324.